﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RRHH.Competencias.Controladores;
using RRHH.Competencias.Entities.AdminPermisos;
using RRHH.Competencias.BusinessLayer;

namespace WebSite.AdministracionPermisos
{
    public partial class Permisos : System.Web.UI.Page
    {
        protected string codigoPantalla = "PERMISOS";

        protected void Page_Load ( object sender, EventArgs e )
        {
            if (!Page.IsPostBack)
            {
                if (!Master.ValidarAcceso(codigoPantalla)) Response.Redirect("Inicio.aspx");

                Session["ABMPermisos.Listado.OrdenarExpresion"] = null;
                Session["ABMPermisos.Listado.OrdenarDireccion"] = null;

                BtnAsignarCancelar.Attributes.Add( "onclick", "return confirm('Esta seguro que desea cancelar la asignacion?')" );
                
                TxtAsignarUsuarioDescripcion.Attributes.Add( "readonly", "readonly" );
                
                Session["ABMPermisos.FuncionesSeleccionadas"] = null;

                this.BtnBuscar_Click( null, null );

                ModalPopupExtenderPermisoAsignar.Hide();
            }
        }

        private void Buscar ( Usuario usuario, Funcion funcion, int pagina )
        {
            GestorPermiso gPermiso = new GestorPermiso();
            List<Permiso> permisos = gPermiso.Buscar( usuario, funcion, true );

            if (Session["ABMPermisos.Listado.OrdenarExpresion"] != null)
            {
                permisos.Sort( new GridViewGenericComparer<Permiso>( Session["ABMPermisos.Listado.OrdenarExpresion"].ToString(), SortDirection.Ascending ) );
            }

            GrdPermisos.DataSource = permisos;
            GrdPermisos.PageIndex = pagina;
            GrdPermisos.DataBind();
        }

        private void RegistrarMensajeJavascript ( string nombre, string mensaje )
        {
            mensaje = mensaje.Replace( "'", string.Empty );
            mensaje = mensaje.Replace( "(", string.Empty );
            mensaje = mensaje.Replace( ")", string.Empty );
            mensaje = mensaje.Replace( ",", string.Empty );
            mensaje = mensaje.Replace( ";", string.Empty );
            mensaje = mensaje.Replace( "\"", string.Empty );

            ScriptManager.RegisterStartupScript( this, this.GetType(), nombre, "alert('" + mensaje + "');", true );
        }

        private string LimpiarCadenaJavascript ( string mensaje )
        {
            mensaje = mensaje.Replace( "'", string.Empty );
            mensaje = mensaje.Replace( "(", string.Empty );
            mensaje = mensaje.Replace( ")", string.Empty );
            mensaje = mensaje.Replace( ",", string.Empty );
            mensaje = mensaje.Replace( ";", string.Empty );
            mensaje = mensaje.Replace( "\"", string.Empty );

            return mensaje;
        }

        protected void LimpiarCamposPermisoAsignar ()
        {
            TxtAsignarUsuarioCodigo.Text = string.Empty;
            TxtAsignarUsuarioDescripcion.Text = string.Empty;
                        
            GrdAsignarFuncionesDisponibles.DataSource = null;
            GrdAsignarFuncionesDisponibles.DataBind();
            GrdAsignarFuncionesSeleccionadas.DataSource = null;
            GrdAsignarFuncionesSeleccionadas.DataBind();
        }

        protected void BtnBuscar_Click ( object sender, ImageClickEventArgs e )
        {
            Usuario usuario = null;            
            Funcion funcion = null;
            
            long idUsuario, idFuncion;

            if (!string.IsNullOrEmpty( TxtBuscarUsuarioCodigo.Text ) && long.TryParse( TxtBuscarUsuarioCodigo.Text, out idUsuario ))
            {
                usuario = new Usuario();
                usuario.Id = idUsuario;
            }

            
            if (!string.IsNullOrEmpty( TxtBuscarFuncionCodigo.Text ) && long.TryParse( TxtBuscarFuncionCodigo.Text, out idFuncion ))
            {
                funcion = new Funcion();
                funcion.Id = idFuncion;
            }

            
            try
            {
                this.Buscar( usuario, funcion, 0 );                
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo realizar la búsqueda de Permisos. " + ex.Message );
            }
            
            UpdatePanelPermisos.Update();
        }

        protected void GrdPermisos_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            Usuario usuario = null;            
            Funcion funcion = null;

            long idUsuario, idFuncion;

            if (!string.IsNullOrEmpty( TxtBuscarUsuarioCodigo.Text ) && long.TryParse( TxtBuscarUsuarioCodigo.Text, out idUsuario ))
            {
                usuario = new Usuario();
                usuario.Id = idUsuario;
            }

            
            if (!string.IsNullOrEmpty( TxtBuscarFuncionCodigo.Text ) && long.TryParse( TxtBuscarFuncionCodigo.Text, out idFuncion ))
            {
                funcion = new Funcion();
                funcion.Id = idFuncion;
            }

            
            try
            {
                this.Buscar( usuario, funcion, e.NewPageIndex );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo realizar la búsqueda de Permisos. " + ex.Message );
            }

            UpdatePanelPermisos.Update();
        }

        protected void TxtBuscarUsuarioCodigo_TextChanged ( object sender, EventArgs e )
        {
            Usuario usuario = null;
            long idUsuario;

            TxtBuscarUsuarioDescripcion.Text = string.Empty;

            if (string.IsNullOrEmpty( TxtBuscarUsuarioCodigo.Text )) return;

            if (!long.TryParse( TxtBuscarUsuarioCodigo.Text, out idUsuario ))
            {
                TxtBuscarUsuarioCodigo.Text = string.Empty;
                TxtBuscarUsuarioCodigo.Focus();
                return;
            }

            usuario = new Usuario();
            usuario.Id = idUsuario;

            try
            {
                GestorUsuario gUsuario = new GestorUsuario();
                usuario = gUsuario.CompletarBasico( usuario, true );
            }
            catch (Exception)
            {
                TxtBuscarUsuarioCodigo.Text = string.Empty;
                TxtBuscarUsuarioCodigo.Focus();
                return;
            }

            if (usuario != null && !string.IsNullOrEmpty( usuario.Descripcion ))
            {
                TxtBuscarUsuarioDescripcion.Text = usuario.Descripcion;
            }

            TxtBuscarUsuarioCodigo.Focus();
        }

        protected void TxtBuscarFuncionCodigo_TextChanged ( object sender, EventArgs e )
        {
            Funcion funcion = null;
            long idFuncion;

            TxtBuscarFuncionDescripcion.Text = string.Empty;

            if (!long.TryParse( TxtBuscarFuncionCodigo.Text, out idFuncion ))
            {
                TxtBuscarFuncionCodigo.Text = string.Empty;
                TxtBuscarFuncionCodigo.Focus();
                return;
            }

            funcion = new Funcion();
            funcion.Id = idFuncion;

            try
            {
                GestorFuncion gFuncion = new GestorFuncion();
                funcion = gFuncion.CompletarBasico( funcion, true );
            }
            catch (Exception)
            {
                TxtBuscarFuncionCodigo.Text = string.Empty;
                TxtBuscarFuncionCodigo.Focus();
                return;
            }

            if (funcion != null && !string.IsNullOrEmpty( funcion.Descripcion ))
            {
                TxtBuscarFuncionDescripcion.Text = funcion.Descripcion;
            }

            TxtBuscarFuncionCodigo.Focus();
        }

        protected void BtnPermisoAsignar_Click ( object sender, ImageClickEventArgs e )
        {
            this.LimpiarCamposPermisoAsignar();
            UpdatePanelAsignarPermiso.Update();

            ModalPopupExtenderPermisoAsignar.Show();

            this.CompletarListadoFuncionesDisponibles( 0 );
        }

        protected void GrdAsignarFuncionesDisponibles_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            this.CompletarListadoFuncionesDisponibles( e.NewPageIndex );
        }

        protected void CompletarListadoFuncionesDisponibles ( int pagina )
        {
            

            GestorFuncion gFuncion = new GestorFuncion();
            List<Funcion> funciones = new List<Funcion>();

            try
            {
                funciones = gFuncion.BuscarTodos( true );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudieron obtener las funciones asociadas al sistema. " + ex.Message );
                return;
            }

            GrdAsignarFuncionesDisponibles.DataSource = funciones;
            GrdAsignarFuncionesDisponibles.PageIndex = pagina;
            GrdAsignarFuncionesDisponibles.DataBind();
        }

        protected void GrdAsignarFuncionesDisponibles_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int fila = Convert.ToInt32( e.CommandArgument );
            GestorFuncion gFuncion = new GestorFuncion();
            GestorPermiso gPermiso = new GestorPermiso();

            switch (e.CommandName.ToUpper())
            {
                case "AGREGAR":
                    if (string.IsNullOrEmpty( TxtAsignarUsuarioCodigo.Text ) ||
                        string.IsNullOrEmpty( TxtAsignarUsuarioDescripcion.Text ))
                    {
                        this.RegistrarMensajeJavascript( "Error", "Seleccione un usuario para realizar la asignacion" );
                        return;
                    }

                    long idUsuario;

                    if (!long.TryParse( TxtAsignarUsuarioCodigo.Text, out idUsuario ))
                    {
                        this.RegistrarMensajeJavascript( "Error", "Seleccione un usuario para realizar la asignacion" );
                        return;
                    }

                    Usuario usuario = new Usuario();
                    usuario.Id = idUsuario;

                    Funcion funcion = new Funcion();
                    funcion.Id = Convert.ToInt64( GrdAsignarFuncionesDisponibles.DataKeys[fila].Values["Id"] );

                    List<Funcion> funcionesSeleccionadas = new List<Funcion>();

                    if (Session["ABMPermisos.FuncionesSeleccionadas"] != null)
                        funcionesSeleccionadas = (List<Funcion>)Session["ABMPermisos.FuncionesSeleccionadas"];

                    if (funcionesSeleccionadas.Contains( funcion ))
                    {
                        this.RegistrarMensajeJavascript( "Error", "Esta funcion ya fue asignada" );
                        return;
                    }

                    try
                    {
                        funcion = gFuncion.Completar( funcion, true );
                    }
                    catch (Exception ex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo obtener informacion de la funcion seleccionada. " + ex.Message );
                        return;
                    }

                    if (funcion == null)
                    {
                        this.RegistrarMensajeJavascript( "Error", "La funcion seleccionada no existe" );
                        return;
                    }

                    bool resultado = false;

                    try
                    {
                        resultado = gPermiso.PoseePermisosParaFuncion( usuario, funcion, true );
                    }
                    catch (Exception ex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo obtener informacion sobre los permisos del usuario. " + ex.Message );
                        return;
                    }

                    if (resultado)
                    {
                        this.RegistrarMensajeJavascript( "Error", "El usuario ya posee acceso a esta funcion" );
                        return;
                    }

                    funcionesSeleccionadas.Add( funcion );
                    Session["ABMPermisos.FuncionesSeleccionadas"] = funcionesSeleccionadas;

                    this.CompletarListadoFuncionesSeleccionadas( 0 );

                    break;
            }
        }

        protected void CompletarListadoFuncionesSeleccionadas ( int pagina )
        {
            List<Funcion> funcionesSeleccionadas = new List<Funcion>();

            if (Session["ABMPermisos.FuncionesSeleccionadas"] != null)
                funcionesSeleccionadas = (List<Funcion>)Session["ABMPermisos.FuncionesSeleccionadas"];

            GrdAsignarFuncionesSeleccionadas.DataSource = funcionesSeleccionadas;
            GrdAsignarFuncionesSeleccionadas.PageIndex = pagina;
            GrdAsignarFuncionesSeleccionadas.DataBind();
        }

        protected void TxtAsignarUsuarioCodigo_TextChanged ( object sender, EventArgs e )
        {
            Usuario usuario = null;
            long idUsuario;

            Session["ABMPermisos.FuncionesSeleccionadas"] = null;
            this.CompletarListadoFuncionesSeleccionadas( 0 );

            TxtAsignarUsuarioDescripcion.Text = string.Empty;

            if (string.IsNullOrEmpty( TxtAsignarUsuarioCodigo.Text )) return;

            if (!long.TryParse( TxtAsignarUsuarioCodigo.Text, out idUsuario ))
            {
                TxtAsignarUsuarioCodigo.Text = string.Empty;
                TxtAsignarUsuarioCodigo.Focus();
                return;
            }

            usuario = new Usuario();
            usuario.Id = idUsuario;

            GestorUsuario gUsuario = new GestorUsuario();

            try
            {
                usuario = gUsuario.CompletarBasico( usuario, true );
            }
            catch (Exception)
            {
                TxtAsignarUsuarioCodigo.Text = string.Empty;
                TxtAsignarUsuarioCodigo.Focus();
                return;
            }

            if (usuario != null && !string.IsNullOrEmpty( usuario.Descripcion ))
            {
                TxtAsignarUsuarioDescripcion.Text = usuario.Descripcion;
            }

            TxtAsignarUsuarioCodigo.Focus();
        }

        protected void GrdAsignarFuncionesSeleccionadas_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            this.CompletarListadoFuncionesSeleccionadas( e.NewPageIndex );
        }

        protected void GrdAsignarFuncionesSeleccionadas_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int fila = Convert.ToInt32( e.CommandArgument );

            switch (e.CommandName.ToUpper())
            {
                case "QUITAR":
                    Funcion funcion = new Funcion();
                    funcion.Id = Convert.ToInt64( GrdAsignarFuncionesSeleccionadas.DataKeys[fila].Values["Id"] );

                    List<Funcion> funcionesSeleccionadas = new List<Funcion>();

                    if (Session["ABMPermisos.FuncionesSeleccionadas"] != null)
                        funcionesSeleccionadas = (List<Funcion>)Session["ABMPermisos.FuncionesSeleccionadas"];

                    funcionesSeleccionadas.Remove( funcion );

                    Session["ABMPermisos.FuncionesSeleccionadas"] = funcionesSeleccionadas;

                    this.CompletarListadoFuncionesSeleccionadas( 0 );

                    break;
            }
        }

        protected void BtnAsignarCancelar_Click ( object sender, ImageClickEventArgs e )
        {
            ModalPopupExtenderPermisoAsignar.Hide();
        }

        protected void BtnAsignarAceptar_Click ( object sender, ImageClickEventArgs e )
        {
            //Validaciones
            Usuario usuarioPermiso = null;
            long idUsuario;

            if (string.IsNullOrEmpty( TxtAsignarUsuarioCodigo.Text ) ||
               string.IsNullOrEmpty( TxtAsignarUsuarioDescripcion.Text ))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe seleccionar un usuario" );
                return;
            }

            if (!long.TryParse( TxtAsignarUsuarioCodigo.Text, out idUsuario ))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe seleccionar un usuario" );
                return;
            }

            usuarioPermiso = new Usuario();
            usuarioPermiso.Id = idUsuario;

            if (Session["ABMPermisos.FuncionesSeleccionadas"] == null)
            {
                this.RegistrarMensajeJavascript( "Error", "Debe seleccionar al menos una funcion para agregar" );
                return;
            }

            List<Funcion> funciones = (List<Funcion>)Session["ABMPermisos.FuncionesSeleccionadas"];

            //Superadas las validaciones, registramos los permisos
            try
            {
                GestorPermiso gPermiso = new GestorPermiso();

                foreach (Funcion funcion in funciones)
                {
                    Permiso permiso = new Permiso();
                    permiso.Funcion = funcion;
                    permiso.Usuario = usuarioPermiso;
                    permiso.UsuarioAlta = (Usuario)Session["AdmnUsuarios.Usuario"];

                    gPermiso.Registrar( permiso );
                }
            }
            catch (BusinessException bex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudieron registrar los permisos. " + bex.Message );
                return;
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "Error inesperado al registrar los permisos. " + ex.Message );
                return;
            }

            ModalPopupExtenderPermisoAsignar.Hide();
            this.BtnBuscar_Click( null, null );

            this.RegistrarMensajeJavascript( "Mensaje", "La asignación de permisos se completó exitosamente" );
        }

        protected void GrdPermisos_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int indiceFila;

            switch (e.CommandName.ToUpper())
            {
                case "DESACTIVAR":
                    indiceFila = Convert.ToInt16( e.CommandArgument );

                    Usuario usuarioPermiso = new Usuario();
                    usuarioPermiso.Id = Convert.ToInt64( GrdPermisos.DataKeys[indiceFila].Values["UsuarioID"] );

                    Funcion funcion = new Funcion();
                    funcion.Id = Convert.ToInt64( GrdPermisos.DataKeys[indiceFila].Values["FuncionID"] );

                    Permiso permiso = new Permiso();
                    permiso.Funcion = funcion;
                    permiso.Usuario = usuarioPermiso;

                    try
                    {
                        permiso.UsuarioBaja = (Usuario)Session["AdmnUsuarios.Usuario"];

                        GestorPermiso gPermiso = new GestorPermiso();
                        gPermiso.Eliminar( permiso );
                    }
                    catch (BusinessException bex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo eliminar el permiso. " + bex.Message );
                        return;
                    }
                    catch (Exception ex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "Error inesperado al eliminar el permiso. " + ex.Message );
                        return;
                    }

                    this.BtnBuscar_Click( null, null );
                    this.RegistrarMensajeJavascript( "Mensaje", "El permiso se desactivó exitosamente. Puede reactivarlo mediante una nueva asignación." );

                    break;
            }
        }

        protected void GrdPermisos_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            LinkButton lnkButtonActDes;

            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string nombreUsuario = this.LimpiarCadenaJavascript( e.Row.Cells[0].Text );
                string nombreFuncion = this.LimpiarCadenaJavascript( e.Row.Cells[1].Text );

                lnkButtonActDes = (LinkButton)e.Row.Cells[2].Controls[0];
                lnkButtonActDes.Attributes.Add( "onclick", "return confirm('Esta seguro que desea desactivar " + nombreFuncion + " al usuario " + nombreUsuario + "?')" );
            }
        }

        protected void GrdPermisos_Sorting ( object sender, GridViewSortEventArgs e )
        {
            Session["ABMPermisos.Listado.OrdenarExpresion"] = e.SortExpression;
            Session["ABMPermisos.Listado.OrdenarDireccion"] = e.SortDirection;

            this.BtnBuscar_Click( null, null );
        }

        protected void GrdAsignarFuncionesSeleccionadas_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {                
                string descripcionFuncion = e.Row.Cells[1].Text;
                if (descripcionFuncion.Length > 20) e.Row.Cells[1].Text = descripcionFuncion.Substring( 0, 20 ) + "...";
            }
        }

        protected void cmdBuscarFuncion_Click ( object sender, ImageClickEventArgs e )
        {
            

            GestorFuncion gFuncion = new GestorFuncion();
            List<Funcion> funciones = new List<Funcion>();

            Funcion funcion = new Funcion();
            funcion.Descripcion = txtBuscarFuncionDisponibleDescripcion.Text;


            try
            {
                funciones = gFuncion.Buscar( funcion, true);
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudieron obtener las funciones asociadas a la descripcion. " + ex.Message );
                return;
            }

            GrdAsignarFuncionesDisponibles.DataSource = funciones;
            GrdAsignarFuncionesDisponibles.PageIndex = 0;
            GrdAsignarFuncionesDisponibles.DataBind();
        }
        


    }
}